/***************************************************************************************************
 *Copyright(C),2010-2017,Sumscope
 *FileName    :  PanoramicBondDealContainer.h
 *Author    :  shangyi.xin
 *Version    :  1.0
 *Date        :  2019/03/06
 *Desc        :  //用于主要说明此程序文件完成的主要功能
 *Relation :
 *Others    :  //其他内容说明
 *Function :  //主要函数列表，每条记录应包含函数名及功能简要说明
 *History    :
 * //修改历史记录列表，每条修改记录应包含修改日期、修改者及修改内容简介
 ***************************************************************************************************/
#pragma once
#include <core/sync/lock.h>

#include "../BondInfo.h"
#include "PanoramicBondDealStruct.h"

class xQBPanoramicMarketStreamDealAck;
class CBondHisMarketstreamDay;
// class CBondInfo;

class S_BONDLIB_EXPORT CPanoramicBondDealContainer {
 public:
  CPanoramicBondDealContainer();
  static CPanoramicBondDealContainer& instance();

  bool IsContainerEmpty();
  void SetReqData();
  bool GetReqData();  // 是否请求过数据

  void Clear();
  void UpdateBondDeal(xQBPanoramicMarketStreamDealAck* pData);
  void ReCalculaterAllCDC();
  void GetDisChartData(int nType, time_t tNow, CDealDisChartList& data,
                       bool eng = false);
  void GetEstimatePrice(double& dEstPrice, double& dEstCleanPrice,
                        const double& dDealYield, const double& dDealCleanPrice,
                        int nBondIndex);

  qb::base::CSLock& GetLock() { return m_lock; }

  CPanoramicBondDealMap& GetDealMap() { return m_bondDeal; }
  const BondDealInfo& getDealInfo(int bondIndex);

  void SetHistory();
  static int GetDate(const char* cData);
  static int GetBondDealInvalidateDay();
  static double FloatToDouble(const float& fValue);

 private:
  bool ReCalcuCDC(sPanoramicBondDealUnit& cdcUnit);

  static double GetDoubleValue(const char* pValue);
  static double GetDoubleBP(const double& dValue1, const double& dValue2);
  static double GetDoublePercent(const double& dValue1, const double& dValue2);
  static int VerifyChangeType(const int nType,
                              const sPanoramicBondDealUnit& unit);
  static int VerifyDealDisType(const int nType, CBondInfo* pBondInfo);
  static bool VerifyDirection(const double& dLeft,
                              const double& dRight);  // 判断是否同向债券
  static bool VerifyDealValid(
      const sPanoramicBondDealUnit& unit);  // 判断成交是否为有效值
  static bool VerifyYieldValid(
      const sPanoramicBondDealUnit& unit);  // 提前去掉永续债和提前还本债券
  static bool VerifyBondValid(
      const sPanoramicBondDealUnit& unit);  // 过滤掉成交计算错误的值

  // 计算函数
  static bool IsStringEmpty(const char* pStr);

 private:
  CPanoramicBondDealMap m_bondDeal;  // 成交数据集合
  qb::base::CSLock m_lock;

  bool m_bGetData;  // 是否已经请求过,如果请求过,数据将持续接收推送;
  bool m_isHistory;  // 是否属于历史缓存

  std::map<std::string, sPanoramicBondDealUnit> m_mapDeal;
};